package untils

import (
	"fmt"
	"math"
)

// CalculateDistance 使用Haversine公式计算两点之间的距离（单位：千米）
// 参数：lat1, lon1 - 点1的纬度和经度
//      lat2, lon2 - 点2的纬度和经度
// 返回：两点之间的直线距离（千米）
func CalculateDistance(lat1, lon1, lat2, lon2 float64) float64 {
	const earthRadius = 6371 // 地球平均半径（千米）

	// 将角度转换为弧度
	lat1Rad := degToRad(lat1)
	lon1Rad := degToRad(lon1)
	lat2Rad := degToRad(lat2)
	lon2Rad := degToRad(lon2)

	// 计算差值
	deltaLat := lat2Rad - lat1Rad
	deltaLon := lon2Rad - lon1Rad

	// Haversine公式
	a := math.Sin(deltaLat/2)*math.Sin(deltaLat/2) +
		math.Cos(lat1Rad)*math.Cos(lat2Rad)*
			math.Sin(deltaLon/2)*math.Sin(deltaLon/2)
	c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))

	// 距离
	distance := earthRadius * c

	return distance
}

// degToRad 将角度转换为弧度
func degToRad(deg float64) float64 {
	return deg * math.Pi / 180
}

// FormatDistance 格式化距离显示
// 参数：distanceKm - 距离（千米）
// 返回：格式化后的距离字符串
func FormatDistance(distanceKm float64) string {
	if distanceKm < 1 {
		// 小于1公里，显示米
		meters := int(math.Round(distanceKm * 1000))
		return fmt.Sprintf("%dm", meters)
	} else if distanceKm < 10 {
		// 1-10公里，保留1位小数
		return fmt.Sprintf("%.1fkm", distanceKm)
	} else {
		// 大于10公里，取整
		return fmt.Sprintf("%.0fkm", distanceKm)
	}
}

// IsWithinRadius 判断两点是否在指定半径范围内
// 参数：lat1, lon1 - 点1的纬度和经度
//      lat2, lon2 - 点2的纬度和经度
//      radiusKm - 半径（千米）
// 返回：是否在范围内
func IsWithinRadius(lat1, lon1, lat2, lon2, radiusKm float64) bool {
	distance := CalculateDistance(lat1, lon1, lat2, lon2)
	return distance <= radiusKm
}

// GetDistanceLevel 获取距离等级
// 返回距离的文字描述
func GetDistanceLevel(distanceKm float64) string {
	if distanceKm < 1 {
		return "附近"
	} else if distanceKm < 5 {
		return "很近"
	} else if distanceKm < 20 {
		return "较近"
	} else if distanceKm < 50 {
		return "同城"
	} else {
		return "较远"
	}
}

// 示例：常见城市坐标
// 北京: 39.9042, 116.4074
// 上海: 31.2397, 121.4997
// 广州: 23.1087, 113.3245
// 深圳: 22.5431, 114.0579
// 杭州: 30.2741, 120.1551

